"""
每隔 N 帧提取一帧
"""

import cv2
import os

def extract_frames_at_interval(video_path, output_folder, interval):
    """
    每隔指定帧数提取一帧。

    :param video_path: 输入视频文件的路径。
    :param output_folder: 保存帧图片的输出文件夹路径。
    :param interval: 提取间隔（每隔 interval 帧提取一帧）。
    """
    if not os.path.exists(output_folder):
        os.makedirs(output_folder)

    cap = cv2.VideoCapture(video_path)

    if not cap.isOpened():
        print(f"错误：无法打开视频文件 {video_path}")
        return

    total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
    saved_frame_count = 0

    print(f"开始每隔 {interval} 帧提取一帧...")

    for i in range(total_frames):
        ret, frame = cap.read()

        if not ret:
            break

        # 核心逻辑：只有当帧计数器是 interval 的倍数时才保存
        if i % interval == 0:
            output_filename = os.path.join(output_folder, f"iframe_{str(saved_frame_count).zfill(4)}.jpg")
            cv2.imwrite(output_filename, frame)
            saved_frame_count += 1

            if saved_frame_count % 10 == 0:  # 每保存10帧打印一次
                print(f"已提取 {saved_frame_count} 帧...")

    cap.release()
    cv2.destroyAllWindows()

    print(f"帧提取完成！总共提取了 {saved_frame_count} 帧，保存在 '{output_folder}' 文件夹中。")


# --- 使用示例 ---
if __name__ == "__main__":
    input_video_path = "input/boy.mp4"
    output_frames_folder = "extracted_frames_interval"
    # 每隔 30 帧提取一帧（如果视频是30FPS，大约就是每秒提取一帧）
    extraction_interval = 30

    extract_frames_at_interval(input_video_path, output_frames_folder, extraction_interval)